package com.service.image;


import java.io.IOException;
import java.io.OutputStream;
//import java.security.NoSuchAlgorithmException;
import java.util.Map;

import org.apache.log4j.Logger;

import com.pub.cache.ObjectCacheWithListener;
import com.pub.image.ImageZoom;
import com.pub.util.SecurityUtils;
import com.pub.util.StringUtils;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;



public class ImageHttpHandler implements HttpHandler
{
//	private static byte[] lock = new byte[0];
	private static int imgCacheSize;	//	default : 50000;

	private static String imageFormatPre 	= "image/";
	private static String defaultImage 		= "default.jpg";

	private static String imageRootPath;
	
	private static Logger logger;

	private static 	ImageZoom imageUtil;

	public static ObjectCacheWithListener outImgCache;

	static
	{
		logger 		= Logger.getLogger (ImageHttpHandler.class.getName());
		
		imageUtil 	= new ImageZoom();
	}

	/**
	 * 
	 */
	public ImageHttpHandler(String rootPath, int cacheSize) 
	{
		imageRootPath 	= rootPath;
		imgCacheSize 	= cacheSize;
		
		outImgCache = new ObjectCacheWithListener(imgCacheSize);
	}

	public void setDefaultImage(String filename)
	{
		defaultImage = filename;
	}
	
	public void setImageTmpDIR(String imageTmpDIR)
	{
//		imageUtil.setTmpDIR(imageTmpDIR);
	}

	@SuppressWarnings("unchecked")
	@Override
	public void handle(HttpExchange httpExchange) throws IOException 
	{
////		synchronized(lock){
//		
//		Map<String, Object> params = (Map<String, Object>)httpExchange.getAttribute("parameters");
//		logger.debug("params----------- = " + params.toString());
//		
//		
//		OutputStream out 	= httpExchange.getResponseBody();
// 		
//		Headers qheaders 	= httpExchange.getRequestHeaders();
//		Headers headers 	= httpExchange.getResponseHeaders();  
//        
//		
//        headers.set("Server", "ProxyHttpServer 0.1");
//
//        System.out.println("========If-none-match====== " + qheaders.getFirst("If-none-match"));
//        
//		System.out.println("========keySet====== " + qheaders.keySet().toString());
//		System.out.println("========entrySet====== " + qheaders.entrySet().toString());
//		System.out.println("========values====== " + qheaders.values().toString());
//
//
//        byte[] imgByte = null;
//        
//        int width 	= 0;
//        int height	= 0;
//        
//        int imageID	= 0;
//        
//        String qeuryID 		= null;
//        String ifNoneMatch	= null;
//        
//        StringBuilder sbFilePath = new StringBuilder(50);
//        
//        OutImageObject outImgObject;
//		try {
//			qeuryID 	= SecurityUtils.getMD5(params.toString());
//			ifNoneMatch = qheaders.getFirst("If-none-match");
//			
//			if(params.containsKey("width") && ((String)params.get("width")).matches("[\\d]+")){
//				width = Integer.parseInt((String)params.get("width"));
//			}
//
//			if(params.containsKey("height") && ((String)params.get("height")).matches("[\\d]+")){
//				height = Integer.parseInt((String)params.get("height"));
//			}
//			
//			if(params.containsKey("imageID") && ((String)params.get("imageID")).matches("[\\d]+")){
//				imageID = Integer.parseInt((String)params.get("imageID"));
//			}
//			
//			sbFilePath.append(imageRootPath);
//			sbFilePath.append(StringUtils.getDirByID(imageID));
//			sbFilePath.append(imageID);
//			
//			
////			imgStream = imageUtil.getZoom("/usr/home/workspace/InternalManager/WebContent/upload_images/1/00/01/1", width, height, null);
//			
////			logger.debug("image format : " + imageUtil.getImageFormat());
//			
//			System.out.println("========qeuryID====== " + qeuryID);
//			System.out.println("========ifNoneMatch====== " + ifNoneMatch);
//			
//			if(qeuryID != null && outImgCache.containsKey(qeuryID)){
//				outImgObject = (OutImageObject)outImgCache.get(qeuryID);
//				System.out.println("========have queryid ====== " + qeuryID);
//				
//				if(ifNoneMatch != null && outImgObject.getMD5().equals(ifNoneMatch)){
//					System.out.println("========out 304 ====== " + qeuryID);
//					
//					httpExchange.sendResponseHeaders(304, 0);
//					
//					out.flush();
//					out.close();
//					
//					return;
//				}else{
//					imgByte = imageUtil.getZoom(sbFilePath.toString(), width, height, true, null);
//					
//					headers.set("Content-Type", imageFormatPre + imageUtil.getImageFormat());
//					
//					if(imageUtil.getMD5() != null){
//						headers.set("Etag", imageUtil.getMD5());
//						headers.set("Cache-Control", "max-age=604800");
//					}
//				}
//			}else{
//				System.out.println("========none have queryid ====== " + qeuryID);
//				
//				imgByte = imageUtil.getZoom(sbFilePath.toString(), width, height, true, null);
//				
//				headers.set("Content-Type", imageFormatPre + imageUtil.getImageFormat());
//				headers.set("Cache-Control", "max-age=604800");
//
//				if(imageUtil.getMD5() != null){
//					headers.set("Etag", imageUtil.getMD5());
//
//					outImgObject = new OutImageObject();
//					outImgObject.setMD5(imageUtil.getMD5());
//				
//					outImgCache.put(qeuryID, outImgObject);
//				}
//			}
//
//			System.out.println("========imgByte.length ====== " + imgByte.length);
//			if(imgByte != null && imgByte.length > 0){
//				httpExchange.sendResponseHeaders(200, 0);
//				
//				out.write(imgByte);
//			}else{
//				httpExchange.sendResponseHeaders(404, 0);
//			}
//		} catch (Exception e) {
//			try{
//				sbFilePath.delete(0, sbFilePath.length());
//				sbFilePath.append(imageRootPath);
//				sbFilePath.append("/");
//				sbFilePath.append(defaultImage);
//				
//				imgByte = imageUtil.getZoom(sbFilePath.toString(), width, height, true, null);
//				
//				headers.set("Content-Type", imageFormatPre + imageUtil.getImageFormat());
//				
////				logger.debug("image format : " + imageUtil.getImageFormat());
//				
//				if(qeuryID != null && outImgCache.containsKey(qeuryID)){
//					outImgObject = (OutImageObject)outImgCache.get(qeuryID);
//					System.out.println("========have queryid ====== " + qeuryID);
//					
//					if(ifNoneMatch != null && outImgObject.getMD5().equals(ifNoneMatch)){
//						System.out.println("========out 304 ====== " + qeuryID);
//						
//						httpExchange.sendResponseHeaders(304, 0);
//						
//						out.flush();
//						out.close();
//						
//						return;
//					}else{
//						headers.set("Content-Type", imageFormatPre + imageUtil.getImageFormat());
//						headers.set("Etag", imageUtil.getMD5());
//						headers.set("Cache-Control", "max-age=604800");
//					}
//				}else{
//					System.out.println("========none have queryid ====== " + qeuryID);
//					
//					headers.set("Content-Type", imageFormatPre + imageUtil.getImageFormat());
//					headers.set("Etag", imageUtil.getMD5());
//					headers.set("Cache-Control", "max-age=604800");
//
//					outImgObject = new OutImageObject();
//					outImgObject.setMD5(imageUtil.getMD5());
//				
//					outImgCache.put(qeuryID, outImgObject);
//				}
//				
//				if(imgByte != null && imgByte.length > 0){
//					httpExchange.sendResponseHeaders(200, 0);
//					
//					out.write(imgByte);
//				}else{
//					httpExchange.sendResponseHeaders(404, 0);
//				}
//			} catch (Exception ee) {
//				e.printStackTrace();
//			}
//			
//			e.printStackTrace();
//		}
//
//		out.flush();
//		out.close();
		}
//	}
	
}